#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <pthread.h>
#include <unistd.h>

using namespace std;

string transformTID(const pthread_t& thread_id)
{
    char tid[128];
    snprintf(tid, sizeof(tid), "0x%x", thread_id);

    return tid;
}

void *start_routine(void *args)
{
    string threadname = static_cast<const char *>(args);// 告诉编译器是在已知情况下，进行的强制类型转换，不要报warning

    int cnt = 5;
    while (cnt--)
    {
        cout << threadname << " running... , " << "tid:" << transformTID(pthread_self()) << endl;
        sleep(1);
    }
    
    return nullptr;
}
int main()
{
    pthread_t tid;

    pthread_create(&tid, nullptr, start_routine, (void*)"thread 1");
    pthread_detach(tid);//所以更加推荐的做法是: 在创建线程之后，紧接着就设置线程为分离状态。这样就不用主动sleep主线程了，那样的方式实在挫
    

    //一个线程默认是joinable的，如果设置了分离状态，则不能进行等待了！
    int retnum = pthread_join(tid, nullptr);// 新线程死循环没有退出，那么主线程就会在这里阻塞式等待，同样也不会退出。
    cout << "result: " << retnum << " " << strerror(retnum) << endl;

    return 0;
}